【小ネタ】消し忘れのリモートブランチを一括表示・削除するワンライナー
みなさまリモートリポジトリに消し忘れのブランチはありませんか??
「1年以上の前のブランチ」「自分が作成していない詳細不明のブランチ」などが残っていて、消して良いかもわからない。。。。なんてことあるのではないでしょうか。
通常GitHubなどでfeatureブランチをpushしてpull requestがマージされれば、リモートのfeatureブランチは削除されます。が、
- リモートにpushしたけど結局pull request作成しなかった
- リモートにpushしてpull request作成したけど、必要なかったのでそのままクローズした
- GitHubのブラウザからrevert commit作成したけど、やっぱり使わなかった
などの場合、リモートにブランチが残ります。
そこで今回は、「リモートブランチの詳細を一覧表示」したり、「マージ済みのリモートブランチを一括削除」したりするコマンド(ワンライナー)をいくつか紹介したいと思います。
ワンライナー
※そのままでは利用できない場合は、いい感じに編集してあげてください。
マージされずに残っているリモートブランチ一覧の詳細を取得
$ git branch -v -r --no-merged | grep -v -e master | awk -F ' ' '{print$2}' | xargs -i git show -s --format='%h,%cn,%s,%D,%cd' {} 0d772dd,cm-arais,add feature_2,origin/feature_2, feature_2,Fri Feb 28 20:38:03 2020 +0900 c1d4e27,GitHub,Revert "add feature_1",origin/revert-1-feature_1,Fri Feb 28 20:54:40 2020 +0900 ...省略
masterブランチにマージされたが、まだ残っているリモートブランチ一覧の詳細を取得
$ git branch -v -r --merged origin/master | grep -v -e master | awk -F ' ' '{print$2}' | xargs -i git show -s --format='%h,%cn,%s,%D,%cd' {} 1227ff4,cm-arais,add feature_1,origin/feature_1, feature_1,Fri Feb 28 20:35:12 2020 +0900 ...省略
masterブランチにマージされたが、まだ残っているリモートブランチ一覧を削除する
$ git branch -r --merged origin/master | grep -v -e master | sed -e 's/origin\///g' | xargs -i git push -d origin {} To github.com-cm:cm-arais/git_remove_merged_branch.git - [deleted] feature_1 ...省略
解説
gitコマンド
git branch -r
-r
もしくは--remotes
でリモートブランチの一覧を表示します。
git branch -v
-v
もしくは--verbose
でブランチの詳細情報を表示します。
コミットIDはブランチの先頭のコミットになります。
git branch --merged
マージ済みのブランチの一覧を表示します。
ちなみに、未マージのブランチは--no--merged
で表示できます。
git show -s
該当コミットIDの詳細を表示します。
通常diffが表示されるのですが、-s
でこれを無効化します。
git show --format='%h,%cn,%s,%D,%cd'
該当コミットIDの詳細を指定フォーマットで出力できます。詳細はこちらを確認してください。
今回は、コミッター名%cn
やコミット日時%cd
などの情報が欲しかったので入れています。
git push -d origin <branch_name>
対象のリモートブランチを削除します。
grepコマンド
grep -v -e master
-v
で一致しないものを検索できます。
-e
で検索ワードを指定します。
sedコマンド
sed -e 's/origin\///g'
文字列を置換しています。
リモートブランチの削除でorigin/
が不要なのでここで取り除いています。
awkコマンド
awk -F ' ' '{print$2}'
-F
で区切り文字を指定して、2番目の列の文字を取得しています。
xargsコマンド
xargs -i <command> {}
標準入力を読み込み、それを引数として指定したコマンドを並列実行できます。
-i
と-I {}
は同じ意味です。
パイプで渡ってきたデータが{}
に置き換えられます。
余談
リモートブランチが消えてたのにローカルに残っている! という方はこちらを参考にするかと良いと思います。
私はホームディレクトリの.gitconfig
に下記を追加しました。
[fetch] prune = true
まとめ
いかがだったでしょうか。
やはり、awk
からのxargs
って便利ですよね。
以上、どなたかの役に立てば幸いです。